#include <stdio.h>
#include "Inf_ES8311.h"
#include "Inf_OV2640.h"
#include "Inf_WS2812.h"
#include "esp_task.h"
#include "Dri_Wifi.h"
#include "App_MQTT.h"
#include "App_WS.h"

TaskHandle_t main_task_handler;

/**
 * @description: Wifi连接成功后的回调函数
 * @return {*}
 */
static void wifi_success_cb(void)
{
    MY_LOGE("Wifi连接成功...");

    // TODO Wifi连接成功后续操作,MQTT、WS初始化
    App_MQTT_Start();
    App_WS_Init();
}

void app_main(void)
{
    // 获取当前任务句柄
    main_task_handler = xTaskGetCurrentTaskHandle();

    // 音频模块初始化
    Inf_ES8311_Init();

    // 摄像头模块初始化
    Inf_OV2640_Init();

    // 灯光照明初始化
    Inf_WS2812_Init();

    // Wifi配网模块初始化
    Dri_Wifi_Init();
    Dri_Wifi_Start(wifi_success_cb);

    // uint8_t data[1024] = {0};

    while (1)
    {
        // // // 先从Mic读取数据到ESP32数组
        // esp_err_t err = Inf_ES8311_ReadData(data, 1024);
        // printf("err1 = %#x\r\n", err);
        // // // 将数组中的数据发送给ES8311通过扬声器播放
        // err = Inf_ES8311_WriteData(data, 1024);
        // printf("err2 = %#x\r\n", err);

        uint32_t action = ACTION_AUDIO_VIDEO_NO;
        xTaskNotifyWait(UINT32_MAX, UINT32_MAX, &action, portMAX_DELAY);

        switch (action)
        {
        case ACTION_AUDIO_ESP2CLIENT_ON:
            MY_LOGE("音频 门铃 -> 主人 打开");
            App_WS_Start_Sound_Client(DIR_ESP2CLIENT);
            break;
        case ACTION_AUDIO_ESP2CLIENT_OFF:
            MY_LOGE("音频 门铃 -> 主人 关闭");
            App_WS_Stop_Sound_Client(DIR_ESP2CLIENT);
            break;
        case ACTION_AUDIO_CLIENT2ESP_ON:
            MY_LOGE("音频 主人 -> 门铃 打开");
            App_WS_Start_Sound_Client(DIR_CLIENT2ESP);
            break;
        case ACTION_AUDIO_CLIENT2ESP_OFF:
            MY_LOGE("音频 主人 -> 门铃 关闭");
            App_WS_Stop_Sound_Client(DIR_CLIENT2ESP);
            break;
        case ACTION_VIDEO_ESP2CLIENT_ON:
            MY_LOGE("视频 门铃 -> 主人 打开");
            Inf_WS2812_LedOn();
            App_WS_Start_Video_Client();
            break;
        case ACTION_VIDEO_ESP2CLIENT_OFF:
            MY_LOGE("视频 门铃 -> 主人 关闭");
            Inf_WS2812_LedOff();
            App_WS_Stop_Video_Client();
            break;
        default:
            break;
        }

        // vTaskDelay(10);
    }
}
